package net.hands.common.mail;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.activation.DataSource;

import net.hands.common.IoUtils;
/**
 * 
 * 说明:邮件附件
 * <br>
 * <p>这是一个开源的软件，请在LGPLv3下合法使用、修改或重新发布。</p>
 * @author 陈侃(cknet@126.com, 13910090885)
 *         http://code.google.com/p/simpleframework/
 *         http://www.simpleframework.net
 */
public abstract class EmailAttachment {
   /**
    * 附件名称
    */
	protected final String name;
   /**
    * 内容id
    */
	protected final String contentId;
   /**
    * 
   * Constructor Method  
   * @update 2012-9-21 上午10:25:41  
   * @param name 名字
   * @param contentId 容器id
    */
	protected EmailAttachment(final String name, final String contentId) {
		this.name = name;
		this.contentId = contentId;
	}
   /**
   * 说明:获得名称
   * @return String
   * @update 2012-9-21 上午10:25:47
    */
	public String getName() {
		return name;
	} 
   /**
   * 说明:获得内容id 
   * @return String
   * @update 2012-9-21 上午10:26:06
    */
	public String getContentId() {
		return contentId;
	}
   /**
   * 说明:内容id不为null
   * @return boolean
   * @update 2012-9-21 上午10:26:31
    */
	public boolean isInline() {
		return contentId != null;
	}
   /**
   * 说明:获得数据
   * @return DataSource
   * @update 2012-9-21 上午10:28:11
    */
	public abstract DataSource getDataSource();

	// ---------------------------------------------------------------- size
   /**
    * 附件大小
    */
	protected int size = -1;
   /**
   * 说明:获得附件大小 
   * @return int
   * @update 2012-9-21 上午10:28:32
    */
	public int getSize() {
		return size;
	}
   /**
   * 说明:设置附件大小 
   * @param size 大小
   * @update 2012-9-21 上午10:28:55
    */
	protected void setSize(final int size) {
		this.size = size;
	}

	// ---------------------------------------------------------------- content
	// methods
   /**
   * 说明:转字节数组 
   * @return byte[]
   * @update 2012-9-21 上午10:29:15
    */
	public byte[] toByteArray() {
		final ByteArrayOutputStream out = new ByteArrayOutputStream();
		writeToStream(out);
		return out.toByteArray();
	}
   /**
   * 说明:输出到文件
   * @param destination 目标文件
   * @update 2012-9-21 上午10:30:54
    */
	public void writeToFile(final File destination) {
		InputStream in = null;
		try {
			in = getDataSource().getInputStream();
			IoUtils.copyFile(in, destination);
			// FileUtil.writeStream(destination, in);
		} catch (final IOException ioex) {
			throw new MailException(ioex);
		} finally {
			try {
				in.close();
			} catch (final IOException e) {
			}
		}
	}
   /**
   * 说明:数据源转字节输出流
   * @param out 输出流
   * @update 2012-9-21 上午10:29:53
    */
	public void writeToStream(final OutputStream out) {
		InputStream in = null;
		try {
			in = getDataSource().getInputStream();
			IoUtils.copyStream(in, out);
		} catch (final IOException ioex) {
			throw new MailException(ioex);
		} finally {
			try {
				in.close();
			} catch (final IOException e) {
			}
		}
	}
}
